package config

/**
 * @Author: lcc
 * @Date: 2024年9月8日
 * @Description: 初始化配置文件
 * @File: InitConfig.go
 * @Version: 1.0.0
 * @Note: 加载配置文件
 */
import (
	"fmt"
	"github.com/goccy/go-json"
	"github.com/spf13/viper"
	"os"
	"time"
)

// 配置文件
type Config struct {
	Server struct {
		Host string `mapstructure:"host"` //服务地址
		Port int    `mapstructure:"port"` //服务端口
	} `mapstructure:"server"` //服务配置
	Databases []struct {
		Host     string `mapstructure:"host"`     //数据库地址
		Port     int    `mapstructure:"port"`     //数据库端口
		User     string `mapstructure:"user"`     //数据库用户名
		Password string `mapstructure:"password"` //数据库密码
		Database string `mapstructure:"database"`
	} `mapstructure:"databases"` //数据库配置
	Logs struct {
		Level      string `mapstructure:"level"`      //日志级别
		MaxSize    int    `mapstructure:"maxSize"`    //在日志文件达到  {MaxSize}MB时进行滚动
		MaxBackups int    `mapstructure:"maxBackups"` //保留 {MaxBackups}个滚动日志文件
		MaxAge     int    `mapstructure:"maxAge"`     //保留 {MaxAge}天的日志文件
		Path       string `mapstructure:"path"`       //日志文件路径
	} `mapstructure:"logs"`

	Redis struct {
		Addr     string `mapstructure:"addr"`
		Port     string `mapstructure:"port"`
		Password string `mapstructure:"password"`
		Db       int    `mapstructure:"db"`
		Enabled  bool   `mapstructure:"enabled"`
	} `mapstructure:"redis"`

	Jwt struct {
		Secret          string        `mapstructure:"secret"`
		Expire          time.Duration `mapstructure:"expire"`
		RefreshTokenKey string        `mapstructure:"refreshTokenKey"`
	}
}

// Config toString
func (c *Config) ToString() string {
	// config 转 json
	jsonBytes, err := json.Marshal(c)
	if err != nil {
		fmt.Println(err)
	}
	return string(jsonBytes)
}

var staticConfig Config

func init() {
	fmt.Println("start loading config....")
	envName := os.Getenv("env")
	if envName == "" {
		fmt.Printf("未获取到启动环境变量, 使用默认环境变量: dev\n")
		envName = "dev"
	}
	fmt.Println("运行环境: ", envName)
	viper.SetConfigName("config-" + envName)
	viper.SetConfigType("yaml")
	viper.AddConfigPath("./config")

	if err := viper.ReadInConfig(); err != nil {
		fmt.Printf("Error reading config file, %s", err)
	}

	if err := viper.Unmarshal(&staticConfig); err != nil {
		fmt.Printf("Unable to decode into struct, %v", err)
	}
	fmt.Println(staticConfig.ToString())
	fmt.Println("end loading config....")
}
func GetConfig() (config *Config) {
	return &staticConfig
}
